home *** CD-ROM | disk | FTP | other *** search
/ JCSM Shareware Collection 1996 September / JCSM Shareware Collection (JCS Distribution) (September 1996).ISO / uother__ / sndx10.zip / SOUNDEX.C < prev    next >
C/C++ Source or Header  |  1994-11-06  |  3KB  |  130 lines

  1. /**************************************************************************/
  2. /*                        Soundex Code Generator                          */
  3. /*             Generates the soundex equivalent of input name             */
  4. /*                                                                        */
  5. /*                                M\Cooper                                */
  6. /*                         3425 Chestnut Ridge Rd.                        */
  7. /*                          Grantsville, MD 21536                         */
  8. /*                        email: thegrendel@aol.com                       */
  9. /*                                                                        */
  10. /*               Source code placed in the Public Domain 10/92            */
  11. /**************************************************************************/
  12.  
  13. #include <stdio.h>
  14. #include <string.h>
  15. #include "soundex.h"
  16.  
  17.  
  18. boolean prune_str( char* str, char pr_char )
  19. //Deletes Char pr_char from String str & returns TRUE (1) if successful
  20. {
  21.     char* ptr;
  22.  
  23.         if( !( ptr = strchr( str, pr_char ) ) )
  24.             return (FALSE);
  25.  
  26.         *ptr = NULL;
  27.         strcat( str, ++ptr );
  28.         return (TRUE);
  29.  
  30. }
  31.  
  32.  
  33.  
  34. char xletter( char character )
  35. //Translates Char into numerical code
  36. {
  37.     char code = '*';
  38.  
  39.         switch ( character )
  40.         {
  41.         case 'B': 
  42.         case 'F': 
  43.         case 'P': 
  44.         case 'V': code = '1'; 
  45.                     break;
  46.         case 'C':
  47.         case 'G':
  48.         case 'J':
  49.         case 'K':
  50.         case 'Q':
  51.         case 'S':
  52.         case 'X':
  53.         case 'Z': code = '2';
  54.                     break;
  55.         case 'D':
  56.         case 'T': code = '3';
  57.                      break;
  58.         case 'L': code = '4';
  59.                      break;
  60.         case 'M':
  61.         case 'N': code = '5';
  62.                      break;
  63.         case 'R': code    = '6';
  64.                      break;
  65.         default : code = '*';   // Marker to delete index, later                          
  66.  
  67.         }
  68.  
  69.         return (code );
  70. }
  71.  
  72.  
  73.  
  74.  
  75. char* soundex( char* name )
  76. {
  77.     char *workstr,
  78.           *strhead,
  79.           prevchar;  
  80.     static char zerostr[] = "0000";
  81.     size_t length;
  82.  
  83.     
  84.         workstr = strdup ( name );
  85.         workstr = strupr ( workstr );
  86.         strhead = workstr;   // Keep track of string head.
  87.         ++workstr;          // Preserve first letter.
  88.  
  89.         while ( *workstr )
  90.             {
  91.             prevchar = *workstr;   // Keep track of previous character.
  92.             *workstr++ = xletter( *workstr );
  93.             if( *workstr == prevchar )  // Replace duplicate char
  94.                 *workstr = '*';          // with asterisk [later to be deleted].
  95.             }
  96.  
  97.         while( prune_str( strhead, '*' ) );
  98.  
  99.         if( ( length = SXLENGTH - strlen( strhead ) ) > 0 )
  100.             strncat( strhead, zerostr, length );  //If length < 4, fill with 0's
  101.  
  102.         *( strhead + SXLENGTH ) = NULL;  // Truncate to max. of 4 chars.
  103.  
  104.         return( strhead );
  105.  
  106.  
  107. }
  108.  
  109.  
  110. void main( int argc, char* argv[] )
  111. {
  112.  
  113.     char name [MAXLEN];
  114.  
  115.         if( argc == 2 )
  116.             {
  117.             printf("\nThe soundex conversion of %s is: %s",
  118.                      argv[1], soundex( argv[1] ) );
  119.             }
  120.  
  121.         else
  122.             {
  123.             puts( "\n\nEnter a name, please... " );
  124.             gets( name );        
  125.             printf("\nThe soundex conversion of %s is: %s",
  126.                      name, soundex( name ) ); 
  127.             }
  128.  
  129. }
  130.